//
//  XLHomeViewModel.swift
//  SinaWeibo
//
//  Created by 李凯 on 16/9/6.
//  Copyright © 2016年 kevin. All rights reserved.
//

import UIKit
import SDWebImage


class XLHomeViewModel: NSObject {
    
    var statusArr: [XLStatusViewModel]?
    
    override init() {
        
    }
    
    //加载数据
    func loadData(isPullUp: Bool, completion: @escaping (Bool, Int)->()) {
        let urlString = "https://api.weibo.com/2/statuses/friends_timeline.json"
        
        // 默认maxId 为0
        var maxId: Int64 = 0
        var sinceId: Int64 = 0
        
        // 如果是上拉加载
        if isPullUp {
            // 取到数组中最后一个模型的id
            if let id = statusArr?.last?.status?.id {
                // 将id赋值给 maxid
                // 减1的原因是因为新浪微博会返回比maxId小于或者等于的微博
                maxId = id - 1
            }
        }else{
            //上拉刷新 取到数组中第一个模型的id
            if let id = statusArr?.first?.status?.id {
                sinceId = id
            }
        }

        let params = [
            "max_id": "\(maxId)",
            "since_id": "\(sinceId)",
            "access_token": XLUserAccountViewModel.sharedModel.access_token ?? ""
        ]
        XLNetworkTools.sharedTools.request(method: .Get, urlString: urlString, parameters: params) { (response, error) in
            if response == nil || error != nil {
                print("请求错误\(error)")
                completion(false, 0)
                return
            }
            guard let dictArray = (response! as! [String: Any])["statuses"] as? [[String: Any]] else {
                return
            }
            let modelArr = NSArray.yy_modelArray(with: XLStatus.classForCoder(), json: dictArray) as? [XLStatus]
            
            //初始化一个可变数组
            var tempArr = [XLStatusViewModel]()
            for model in modelArr! {

                //初始化一个viewModel
                let statusViewModel = XLStatusViewModel()
                statusViewModel.status = model
                tempArr.append(statusViewModel)
            }
            
            print("加载回来:\(tempArr.count)条")
            
            if self.statusArr == nil {
                self.statusArr = [XLStatusViewModel]()
            }
            
            if isPullUp {
                // 是上拉加载
                // 要把数据拼接到数组的后面
                self.statusArr = self.statusArr! + tempArr
            }else{
                // 不是上拉加载-->就是下拉刷新
                self.statusArr = tempArr + self.statusArr!
            }

            self.cacheSingleImage(status: tempArr, completion: completion)

            //自己不能刷新数据, 需要通知控制器刷新数据
            //self.tableView.reloadData()
            //completion(true)
            
        }
    }
    
    private func cacheSingleImage(status: [XLStatusViewModel], completion: @escaping (Bool, Int)->()) {
        
        // 初始化一个组
        let group = DispatchGroup.init()
        
        for value in status {
            
            // 如果判断微博模型中的图片张数为1呢?
            guard let pic_urls = (value.status?.pic_urls?.count == 1) ? value.status?.pic_urls : value.status?.retweeted_status?.pic_urls, pic_urls.count == 1 else {
                // 继续下一次循环
                continue
            }
            
            // 取到该单张图片的模型
            let photoInfo = pic_urls.first!
            // 取到模型里面的图片地址
            let urlString = photoInfo.thumbnail_pic
            // 初始成url
            let url = URL(string: urlString ?? "")
            // 下载图片
            group.enter()
            SDWebImageManager.shared().downloadImage(with: url, options: [], progress: nil, completed: { (image, error, _, _, _) in
                // 使用模型去记录图片的大小
                photoInfo.size = image?.size
                print("下载完成:\(urlString)")
                // 出组
                group.leave()
            })
        }
        
        group.notify(queue: DispatchQueue.main) {
            print("所有的单张图片都下载完成")
            completion(true, status.count)
        }
    }

}
